﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>
using namespace std;

//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//protected:
//	string _name = "peter"; // 姓名
//	int _age = 18;
//};
//

// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了
//Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象，可
//以看到变量的复用。调用Print可以看到成员函数的复用。

//class Student : public Person
//{
//protected:
//	int _stuid; // 学号
//};
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//int main()
//{
//	Person p;
//	Student s;
//	Teacher t;
//	s.Print();
//	t.Print();
//	return 0;
//}

// 实例演示三种继承关系下基类成员的各类型成员访问关系的变化 
//class Person
//{
//public:
//	void Print()
//	{
//		cout << _name << endl;
//		cout << "访问" << endl;
//	}
//protected:
//	string _name; // 姓名
//private:
//	int _age; // 年龄
//};
//class Student : protected Person
//class Student : private Person
//class Student : public Person
//{
//protected:
//	int _stunum; // 学号
//};
//
//int main()
//{
//	Person p;
//	Student s;
//	s.Print();
//	return 0;
//}

//int main()
//{
//	double b = 1.1;
//	const int& a1 = b;
//	cout << a1 << endl;
//	return 0;
//}


//class Person
//{
//protected:
//	string _name; // 姓名
//	string _sex;  //性别
//public:
//	int _age = 0; // 年龄
//};
//class Student : public Person
//{
//public:
//	int _No; // 学号
//};
//
//int main()
//{
//	Person p;
//	Student s;
//
//	// 天然的，中间不存在类型转换：不产生临时变量
//	p = s;
//	Person& rp = s;//验证了不产生临时变量，因为不用const
//	rp._age++;
//
//	Person* ptrp = &s;
//	ptrp->_age++;
//	return 0;
//}


// Student的_num和Person的_num构成隐藏关系，可以看出这样代码虽然能跑，但是非常容易混淆
//class Person
//{
//protected:
//	string _name = "小李子"; // 姓名
//	int _num = 111;         //身份证号
//};
//class Student : public Person
//{
//public:
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << ":" << _num << endl;
//		cout << ":" << Person::_num << endl;//指定作用域
//	}
//protected:
//	int _num = 999; // 学号
//};
//void Test()
//{
//	Student s1;
//	s1.Print();
//};
//int main()
//{
//	Test();
//	return 0;
//}

// B中的fun和A中的fun不是构成重载，因为不是在同一作用域
// B中的fun和A中的fun构成隐藏，成员函数满足函数名相同就构成隐藏。
//class A
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	void fun(int i)
//	{
//		A::fun();
//		cout << "func(int i)->" << i << endl;
//	}
//};
//void Test()
//{
//	B b;
//	b.fun(1);
//};
//
//int main()
//{
//	Test();
//	return 0;
//};

//class Person
//{
//public:
//	Person(const char* name = "Peter")
//		: _name(name)
//	{
//		cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//
//		return *this;
//	}
//
//	~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//protected:
//	string _name; // 姓名
//};
//class Student : public Person
//{
//public:
//	Student(const char* name, int num = 18)//构造函数
//		:Person(name)
//		, _num(num)
//	{
//		cout << "Student()" << endl;
//	}
//
//	Student(const Student& s)//拷贝构造
//		:Person(s)
//		, _num(s._num)
//	{}
//
//	Student& operator=(const Student& s)
//	{
//		if (this != &s)
//		{
//			Person::operator=(s);//注意是Person，避免隐藏
//			_num = s._num;
//		}
//		return *this;
//	}
//
//	~Student()//析构
//	{
//		//Person::~Person();//不用调用
//		cout << "~Student()" << endl;
//	}
//protected:
//	int _num; //学号
//};
//
//int main()
//{
//	Student a("张三");
//
//	return 0;
//}

//class Student;
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//class Student : public Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	int _stuNum; // 学号
//};
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;
//}
//int main()
//{
//	Person p;
//	Student s;
//	Display(p, s);
//	return 0;
//}

//class Person
//{
//public:
//	Person() { ++_count; }
//	void Print()
//	{
//		cout << "Print" << endl;
//	}
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//int Person::_count = 0;
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//class Graduate : public Student
//{
//protected:
//	string _seminarCourse; // 研究科目
//};
////静态成员属于整个类，所有对象，同时也属于所有派生类及对象
//int main()
//{
//	/*Person p;
//	Student s;
//	Graduate g;
//	p._name = "张三";
//	s._name = "李四";
//	p._count++;
//	s._count++;
//	cout << p._count << endl;
//	cout << s._count << endl;
//	cout << &p._count << endl;
//	cout << &s._count << endl;
//	cout << Person::_count << endl;
//	cout << Student::_count << endl;
//	cout << Graduate::_count << endl;*/
//
//	//->和*不一定就是解引用
//	Person* ptr = nullptr;
//	ptr->_count++;
//	//cout << ptr->_name << endl;//no
//	ptr->Print();//yes
//	cout << ptr->_count << endl;//yes
//
//	(*ptr).Print();
//	cout << (*ptr)._count << endl;
//	return 0;
//}


//class Person
//{
//public:
//	string _name; // 姓名
//};
//class Student : public Person
//{
//protected:
//	int _num; //学号
//};
//class Teacher : public Person
//{
//protected:
//	int _id; // 职工编号
//};
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//
//int main()
//{
//	Assistant a;
//	//指定作用域
//	a.Student::_name = "张三";
//	a.Teacher::_name = "张老师";
//	cout << &a.Student::_name << endl;
//	cout << &a.Teacher::_name << endl;
//	return 0;
//}

//class Person
//{
//public:
//	string _name; // 姓名
//};
//class Student : virtual public Person
//{
//protected:
//	int _num; //学号
//};
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职工编号
//};
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//
//int main()
//{
//	Assistant a;
//	a._name = "小张";
//	a.Student::_name = "张三";
//	a.Teacher::_name = "张老师";
//	cout << &a._name << endl;
//	cout << &a.Student::_name << endl;
//	cout << &a.Teacher::_name << endl;
//	return 0;
//}


//class A
//{
//public:
//	int _a;
//};
//class B : virtual public A
//{
//public:
//	int _b;
//};
//class C : virtual public A
//{
//public:
//	int _c;
//};
//class D : public B, public C
//{
//public:
//	int _d;
//};
//int main()
//{
//	D d;
//	d._b = 1;
//	d._c = 2;
//	d._d = 3;
//	d.B::_a = 4;
//	d.C::_a = 5;
//
//	B b;
//
//
//	return 0;
//}

//继承
class X
{
	int _x;
};

class Y :public X
{
	int _y;
};

//组合
class M
{
	int _m;
};

class N
{
	M _mm;//组合
	int _n;
};